/*
 * Copyright (C) 2025 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * @addtogroup AVMetadataExtractor
 * @{
 *
 * @brief 提供从媒体资源中获取元数据的API。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @since 18
 */

/**
 * @file avmetadata_extractor.h
 *
 * @brief 定义AVMetadataExtractor接口。使用其Native API从媒体资源中获取元数据。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @kit MediaKit
 * @include <multimedia/player_framework/avmetadata_extractor.h>
 * @library libavmetadata_extractor.so
 * @since 18
 */

#ifndef MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVMETADATA_EXTRACTOR_H
#define MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVMETADATA_EXTRACTOR_H

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "native_averrors.h"
#include "avmetadata_extractor_base.h"
#include "native_avcodec_base.h"
#include "native_avformat.h"
#include "multimedia/image_framework/image/pixelmap_native.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 定义OH_AVMetadataExtractor类型。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @since 18
 */
typedef struct OH_AVMetadataExtractor OH_AVMetadataExtractor;

/**
 * @brief 创建OH_AVMetadataExtractor实例。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @return 创建成功时返回指向OH_AVMetadataExtractor实例的指针，否则返回空指针。
 *         可能的失败原因：HstEngineFactory::CreateAVMetadataHelperEngine执行失败。
 * @since 18
 */
OH_AVMetadataExtractor* OH_AVMetadataExtractor_Create(void);

/**
 * @brief 通过媒体文件描述设置数据源。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @param extractor 指向OH_AVMetadataExtractor实例的指针。
 * @param fd 媒体源的文件描述符。
 * @param offset 媒体源在文件描述符中的偏移量。
 * @param size 媒体源的大小。
 * @return AV_ERR_OK：执行成功。
 *         AV_ERR_INVALID_VAL：输入的extractor为空指针或参数无效。
 *         AV_ERR_OPERATE_NOT_PERMIT：操作被禁止。
 *         AV_ERR_NO_MEMORY：内部内存分配失败。
 * @since 18
 */
OH_AVErrCode OH_AVMetadataExtractor_SetFDSource(OH_AVMetadataExtractor* extractor,
    int32_t fd, int64_t offset, int64_t size);

/**
 * @brief 从媒体资源中获取元数据。\n
 *        此函数必须在{@link OH_AVMetadataExtractor_SetFDSource}之后调用。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @param extractor 指向OH_AVMetadataExtractor实例的指针。
 * @param avMetadata 指向OH_AVFormat实例的指针，其内容包含获取的元数据信息。
 * @return AV_ERR_OK：执行成功。
 *         AV_ERR_INVALID_VAL：输入的extractor为空指针或参数无效。
 *         AV_ERR_OPERATE_NOT_PERMIT：操作被禁止。
 *         AV_ERR_UNSUPPORTED_FORMAT：格式不支持。
 *         AV_ERR_NO_MEMORY：内部内存分配失败。
 * @since 18
 */
OH_AVErrCode OH_AVMetadataExtractor_FetchMetadata(OH_AVMetadataExtractor* extractor, OH_AVFormat* avMetadata);

/**
 * @brief 获取音频专辑封面。\n
 *        此函数必须在{@link OH_AVMetadataExtractor_SetFDSource}之后调用。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @param extractor 指向OH_AVMetadataExtractor实例的指针。
 * @param pixelMap 从音频源获取的专辑封面。
 * @return AV_ERR_OK：执行成功。
 *         AV_ERR_INVALID_VAL：输入的extractor为空指针或参数无效。
 *         AV_ERR_OPERATE_NOT_PERMIT：操作被禁止。
 *         AV_ERR_UNSUPPORTED_FORMAT：格式不支持。
 *         AV_ERR_NO_MEMORY：内部内存分配失败。
 * @since 18
 */
OH_AVErrCode OH_AVMetadataExtractor_FetchAlbumCover(OH_AVMetadataExtractor* extractor, OH_PixelmapNative** pixelMap);

/**
 * @brief 释放用于OH_AVMetadataExtractor的资源并销毁OH_AVMetadataExtractor实例。
 *
 * @syscap SystemCapability.Multimedia.Media.AVMetadataExtractor
 * @param extractor 指向OH_AVMetadataExtractor实例指针。
 * @return AV_ERR_OK：执行成功。
 *         AV_ERR_INVALID_VAL：输入的extractor为空指针或参数无效。
 * @since 18
 */
OH_AVErrCode OH_AVMetadataExtractor_Release(OH_AVMetadataExtractor* extractor);

#ifdef __cplusplus
}
#endif

#endif // MULTIMEDIA_PLAYER_FRAMEWORK_NATIVE_AVMETADATA_EXTRACTOR_H
/** @} */
